:=
).location := expressionOn the lefthand side, location is a variable name or declaration. Most expressions in the ScriptX language can be used on the righthand side. For more information on the assignment expression, see the discussion on page 241 in Appendix A, "ScriptX Reference."
local var := 15
x := "string that goes in x"
Variables can be assigned to a value without being declared
first, as in the previous example. A warning is printed if you
do so. Variables that are assigned a value before they are
declared are automatically declared as global
variables, regardless of the scope in which they are used.
Variable assignment expressions evaluate to the value assigned; this allows you to nest or cascade assignments within other expressions:
z := 14 + (y := 3 - (x := 6))
11
In this example, the expression x := 6
evaluates
to 6
, and y
evaluates to
-3
, allowing the value 11
to be
assigned to z
.
Variable assignment in ScriptX is reference assignment. Assigning one variable to another does not copy the object that variable contains. Both variables contain a reference to the same object. Consider the following assignment expressions:
myRect := new Rect x2:100 y2:100
[0, 0, 100, 100] as Rect
myOtherRect := myRect
[0, 0, 100, 100] as Rect
In the first assignment, a new instance of the
Rect
class is assigned to myRect
(the new
method is described in the next
chapter). In the second assignment, myRect
is
then assigned to myOtherRect
, which has the
effect of setting myOtherRect
to reference the
same Rect
object that myRect
references.
myRect
, you also
change myOtherRect
, since they both refer to the
same object in memory.myRect.y2 := 60
60
myOtherRect
[0, 0, 100, 60] as Rect
Each variable declaration uses only one word of memory, four bytes on a 32-bit processor, until an object is assigned to it. Objects are whatever size they are when instantiated. Once an object is assigned to a variable, ScriptX keeps that object in memory until there is no longer an active reference to it, including any other variables that reference that object. Of course, an object may itself contain references to other objects. Some objects, such as arrays, contain references to objects that are their members or elements.
Memory assigned to a local variable can be reclaimed at the
end of the scope in which that variable is declared. Memory
assigned to a global variable cannot be recovered unless the
value of the variable is set to undefined
, or the
variable is unbound.
To allow the garbage collector to reclaim memory from unused
objects, use local variables whenever possible. For global
variables, set the value of a variable that references the
object to undefined
(or some other value) when
the object is no longer needed. This allows memory to be
reclaimed without undoing the declaration itself.
global garbage := "taking up space"
"taking up space"
garbage := undefined
undefined
garbage
undefined
In this example, garbage
still exists as an empty
slot in memory. This slot points to the undefined
object, a system object.
This document is part of the ScriptX Language Guide, one of the volumes of the ScriptX Technical Reference Series. ScriptX is developed by the ScriptX Engineering Team at Apple Computer, successor to the Kaleida Engineering Team at Kaleida Labs, Inc.